package com.essg.sdc.study;

import java.util.ArrayList;
import java.util.List;

import com.essg.sdc.base.BaseAlgo;

/**
 * <H1>新人社員向けアルゴリズム(Java)</H1>
 *<H2>アルゴリズム（マッチング）</H2><br>
 *<ol>
 *	<li>社員情報(EmpData)、マスタ社員情報(EmpData)を自動生成
 *	<li>ESSコードでマッチングを行い新社員情報を作成する。
 *	<li>新社員情報の一覧表示を行う。
 *</ol>
 *
 * @author ess0034
 */
public class Matching extends BaseAlgo {

	/**
	 * 新社員情報格納先
	 */
	private List<EmpData> mNewEmp;
	/**
	 * マッチング　トラン社員情報
	 */
	private EmpData mTrEmp;
	/**
	 * マッチング　マスタ社員情報
	 */
	private EmpData mMtEmp;
	/**
	 * マッチング　トランＥＳＳＣＤ
	 */
	private String mTrKey;
	/**
	 * マッチング　マスタＥＳＳＣＤ
	 */
	private String mMtKey;

	/**
	 * <H2>マッチング　コンストラクタ</H2>
	 * <ol>
	 * 	<li>Superクラスを実行し社員情報・マスタ社員情報を作成する。
	 * 	<li>ESSコードで昇順ソート
	 * </ol>
	 */
	public Matching() {
		super(ALGO_TYPE.MATCHING);
	}

	/**
	 * <H2>マッチング処理</H2>
	 * トラン社員情報およびマスタ社員情報が共にEOFになるまで処理を繰り返す。
	 * <ul>
	 * 	<oi>マッチした場合、MatchProcessを実施し、トラン社員情報およびマスタ社員情報を読み込む。
	 * 	<oi>トランが大きい場合、MasterProcessを実施し、マスタ社員情報を読み込む。
	 * 	<oi>マスタが大きい場合、TranProcessを実施し、トラン社員情報を読み込む。
	 * 	<oi>DefaultPrintEmpを使用して新マスタ社員情報を表示する。
	 * <ul>
	 */
	@Override
	public void ListAlgo() {

		mNewEmp = new ArrayList<EmpData>();
		mTrEmp = nextEmp();
		mMtEmp = nextMEmp();

		while(!mTrEmp.getEsscd().equals(HIGH_VALUE) || !mMtEmp.getEsscd().equals(HIGH_VALUE)){

			mTrKey = mTrEmp.getEsscd();
			mMtKey = mMtEmp.getEsscd();

			if(mTrKey.compareTo(mMtKey)==0){
				MatchProcess();
				mTrEmp = nextEmp();
				mMtEmp = nextMEmp();
			}else if(mTrKey.compareTo(mMtKey) > 0){
				MasterProcess();
				mMtEmp = nextMEmp();
			}else if(mTrKey.compareTo(mMtKey) < 0){
				TranProcess();
				mTrEmp = nextEmp();
			}

		}

		DefaultPrintEmp(mNewEmp);

	}

	/**
	 * <H2>マッチ処理</H2>
	 * マッチした場合の処理
	 * <ul>
	 * 	<oi>トランの給与からマスタの給与を引いて新マスタの給与に設定する。
	 * 	<oi>トラン情報から、新社員情報を設定する。
	 * 	<oi>新社員情報を登録する。
	 * <ul>
	 */
	private void MatchProcess(){

		EmpData _emp = new EmpData();
		_emp.setPay(mTrEmp.getPay()-mMtEmp.getPay());
		_emp.setEsscd(mTrEmp.getEsscd());
		_emp.setDivcd(mTrEmp.getDivcd());
		_emp.setSeccd(mTrEmp.getSeccd());
		_emp.setName(mTrEmp.getName());

		mNewEmp.add(_emp);

	}

	/**
	 * <H2>トラン処理</H2>
	 * トランのみ存在した場合の処理
	 * <ul>
	 * 	<oi>トラン情報から、新社員情報を設定する。
	 * 	<oi>新社員情報を登録する。
	 * <ul>
	 */
	private void TranProcess(){

		EmpData _emp = new EmpData();
		_emp.setPay(mTrEmp.getPay());
		_emp.setEsscd(mTrEmp.getEsscd());
		_emp.setDivcd(mTrEmp.getDivcd());
		_emp.setSeccd(mTrEmp.getSeccd());
		_emp.setName(mTrEmp.getName());

		mNewEmp.add(_emp);
	}

	/**
	 * <H2>マスタ処理</H2>
	 * マスタのみ存在した場合の処理
	 * <ul>
	 * 	<oi>マスタ情報から、新社員情報を設定する。
	 * 	<oi>新社員情報を登録する。
	 * <ul>
	 */
	private void MasterProcess(){

		EmpData _emp = new EmpData();
		_emp.setPay(mMtEmp.getPay()*10);
		_emp.setEsscd(mMtEmp.getEsscd());
		_emp.setDivcd(mMtEmp.getDivcd());
		_emp.setSeccd(mMtEmp.getSeccd());
		_emp.setName(mMtEmp.getName());

		mNewEmp.add(_emp);
	}

	/**
	 * Matchingの実行メイン
	 * @param args 実行パラメタ（今回は未使用）
	 * Matchingをインスタンス化し、ListAlgo(マッチング処理)を実行
	 */
	public static void main(String[] args) {

		Matching _obj = new Matching();
		_obj.ListAlgo();

	}

}
